#pragma once

#include "raylib.h"
#include <stdlib.h>
#include <stdio.h>
#include <time.h>

// ==================== 游戏常量定义 ====================

// 网格和屏幕尺寸
#define GRID_SIZE 20          // 每个网格的像素大小
#define GRID_WIDTH 40         // 游戏区域宽度（网格数）
#define GRID_HEIGHT 40        // 游戏区域高度（网格数）
#define SCREEN_WIDTH (GRID_WIDTH * GRID_SIZE )    // 屏幕宽度 20 * 40
#define SCREEN_HEIGHT (GRID_HEIGHT * GRID_SIZE)  // 屏幕高度 20 * 40

// 蛇的初始位置
#define INIT_POS_X 10
#define INIT_POS_Y 10

// 颜色定义
#define WALL_COLOR DARKGRAY
#define SNAKE_HEAD_COLOR GREEN
#define SNAKE_BODY_COLOR LIME
#define FOOD_COLOR RED
#define BACKGROUND_COLOR RAYWHITE
#define TEXT_COLOR DARKGRAY

// ==================== 枚举定义 ====================

/**
 * 方向枚举 - 定义蛇的移动方向
 */
typedef enum {
    UP = 1,    // 向上
    DOWN,      // 向下
    LEFT,      // 向左
    RIGHT      // 向右
} DIRECTION;

/**
 * 游戏状态枚举 - 记录游戏当前状态
 */
typedef enum {
    OK,              // 游戏正常运行
    KILL_BY_WALL,    // 撞墙结束
    KILL_BY_SELF,    // 咬到自己结束
    END_NORMAL       // 正常退出
} GAME_STATUS;

// ==================== 数据结构定义 ====================

/**
 * 蛇身节点结构体
 * 使用链表结构表示蛇的每一节身体
 */
typedef struct SnakeNode {
    int x;                    // 节点在网格中的X坐标
    int y;                    // 节点在网格中的Y坐标
    struct SnakeNode* next;   // 指向下一个节点的指针
} SnakeNode;

/**
 * 蛇结构体 - 包含游戏所有状态和数据
 */
typedef struct Snake {
    SnakeNode* head;                 // 指向蛇头的指针
    SnakeNode* food;                 // 指向食物节点的指针
    DIRECTION direction;             // 当前移动方向
    GAME_STATUS status;              // 游戏状态
    int score;                       // 当前得分
    int food_score;                  // 每个食物的基础得分
    float move_interval;             // 移动时间间隔（秒）
    float time_since_last_move;      // 上次移动后经过的时间
    int speed_level;                 // 当前速度等级

} Snake;

// ==================== 函数声明 ====================

// 核心游戏函数
void InitGame(Snake* snake);//初始化
void WelcomeToGame();//欢迎界面
void GameRun(Snake* snake);//游戏运行函数
void GameEnd(Snake* snake);//游戏结束处理

// 初始化函数

void InitSnake(Snake* snake);//初始化蛇
void CreateFood(Snake* snake);//创建食物

// 绘制函数
void DrawGame(Snake* snake);//绘制游戏
void DrawWelcomeScreen();//游戏最初界面
void DrawGameOverScreen(Snake* snake);//绘制游戏结束界面

// 更新函数
void UpdateGame(Snake* snake);//更新游戏数据
void HandleInput(Snake* snake);//玩家输入处理
void MoveSnake(Snake* snake);//蛇的移动

// 工具函数
int CheckCollision(Snake* snake, int new_x, int new_y);//检测是否撞墙
int NextIsFood(SnakeNode* next_node, Snake* snake);//检测下一个是否为食物
void EatFood(SnakeNode* next_node, Snake* snake);//吃掉食物
void FreeSnake(Snake* snake);//释放蛇
void ResetGame(Snake* snake);//重新开始游戏1